﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Web;
using System.Data.SqlClient;
using Model;
using System.Configuration;


namespace DAO
{
    public class FabricanteDAO
    {
        private SqlConnection connection = null;
        private String sqlConn = ConfigurationManager.ConnectionStrings["ControlePedidoDB"].ToString();
        private static FabricanteDAO fabricanteDAO = null;

        private FabricanteDAO()
        {
            this.connection = new SqlConnection(sqlConn);
        }

        public static FabricanteDAO getInstance()
        {
            if (fabricanteDAO == null)
            {
                fabricanteDAO = new FabricanteDAO();
            }

            return fabricanteDAO;
        }

        public bool inserir(Fabricante fabricante)
        {

            bool validacao = false;
            String SQL_INSERT = "INSERT INTO Fabricante " +
                                 "(nome, cnpj, bairro, " +
                                 "endereco, cidade, uf, " +
                                 "tel1, tel2) VALUES " +
                                 " ('" + fabricante.Nome +
                                 "', '" + fabricante.Cnpj +
                                 "', '" + fabricante.Bairro +
                                 "', '" + fabricante.Endereco +
                                 "', '" + fabricante.Cidade +
                                 "', '" + fabricante.Uf +
                                 "', '" + fabricante.Tel1 +
                                 "', '" + fabricante.Tel2 + "')";
            SqlCommand command = null;

            try
            {
                //Abre a conexao com o BD
                connection.Open();

                //Cria comando SQL
                command = new SqlCommand(SQL_INSERT, connection);

                //Executa a query SQL
                command.ExecuteNonQuery();

                validacao = true;

            }
            catch (SqlException exception)
            {
                throw exception;
            }
            finally
            {
                connection.Close();
            }

            return validacao;
        }

        public bool alterar(Fabricante fabricante)
        {
            bool validacao = false;


            String SQL_UPDATE = "UPDATE fabricante SET" +
                                 " nome='" + fabricante.Nome +
                                 "', cnpj='" + fabricante.Cnpj +
                                 "', endereco='" + fabricante.Endereco +
                                 "', bairro='" + fabricante.Bairro +
                                 "', cidade='" + fabricante.Cidade +
                                 "', uf='" + fabricante.Uf +
                                 "', tel1='" + fabricante.Tel1 +
                                 "', tel2='" + fabricante.Tel2 +
                                 "' WHERE id_fabricante='" + fabricante.Codigo + "'";
            SqlCommand command = null;

            try
            {

                connection.Open();

                command = new SqlCommand(SQL_UPDATE, connection);

                command.ExecuteNonQuery();

                validacao = true;

            }
            catch (Exception ex)
            {
                throw ex;
            }
            finally
            {
                connection.Close();
            }

            return validacao;
        }

        public bool cancelar(Fabricante fabricante)
        {
            bool validacao = false;
            String SQL_CANCEL = "DELETE FROM Fabricante WHERE id_fabricante=" + fabricante.Codigo;

            SqlCommand command = null;

            try
            {
                connection.Open();

                command = new SqlCommand(SQL_CANCEL, connection);

                command.ExecuteNonQuery();

                validacao = true;
            }
            catch (Exception ex)
            {
                throw ex;
            }
            finally
            {
                connection.Close();
            }

            return validacao;

        }

        public Fabricante consultar(Fabricante fabricanteEntrada)
        {
            Fabricante fabricante = null;
            String SQL_CONSULTA = "SELECT * FROM fabricante " +
                                  "WHERE id_fabricante = " + fabricanteEntrada.Codigo;
            SqlCommand commandPopula = null;
            SqlDataReader Reader = null;

            try
            {
                connection.Open();

                commandPopula = connection.CreateCommand();

                commandPopula.CommandText = SQL_CONSULTA;

                Reader = commandPopula.ExecuteReader();

                StringBuilder consulta = new StringBuilder();
                String[] resultadoBusca = null;

                while (Reader.Read())
                {
                    for (int i = 0; i < Reader.FieldCount; i++)
                    {
                        consulta.Append(Reader.GetValue(i).ToString() + '/');
                    }

                }

                resultadoBusca = consulta.ToString().Split('/');

                fabricante = new Fabricante();


                fabricante.Codigo = fabricanteEntrada.Codigo;
                fabricante.Nome = resultadoBusca[1];
                fabricante.Cnpj = resultadoBusca[2];
                fabricante.Bairro = resultadoBusca[3];
                fabricante.Endereco = resultadoBusca[4];
                fabricante.Cidade = resultadoBusca[5];
                fabricante.Uf = resultadoBusca[6];
                fabricante.Tel1 = resultadoBusca[7];
                fabricante.Tel2 = resultadoBusca[8];


            }
            catch (Exception ex)
            {
                throw ex;
            }
            finally
            {
                connection.Close();
                Reader.Close();
            }

            return fabricante;
        }

        public List<Fabricante> recuperarTodosFabricantes()
        {
            List<Fabricante> fabricantes = null;
            String SQL_CONSULTA = "SELECT id_fabricante, nome FROM Fabricante";
            SqlCommand comandoExecutar = null;
            SqlDataReader resultadoBusca = null;
            Fabricante auxiliar = null;

            try
            {
                connection.Open();

                comandoExecutar = new SqlCommand(SQL_CONSULTA, connection);

                resultadoBusca = comandoExecutar.ExecuteReader();

                fabricantes = new List<Fabricante>();

                while (resultadoBusca.Read())
                {
                    auxiliar = new Fabricante();

                    auxiliar.Codigo = Int32.Parse(resultadoBusca["id_fabricante"].ToString());
                    auxiliar.Nome = resultadoBusca["nome"].ToString();

                    fabricantes.Add(auxiliar);
                }
            }
            catch (Exception cause)
            {
                throw cause;
            }
            finally
            {
                connection.Close();
            }

            return fabricantes;
        }

        public List<Fabricante> recuperarFabricantes(Fabricante fabricante)
        {
            List<SqlParameter> parametros = new List<SqlParameter>();
            List<Fabricante> fabricantesRecuperados = new List<Fabricante>();
            Fabricante auxiliar = null;
            String SQL_BUSCA = "SELECT id_fabricante, nome, cnpj FROM fabricante WHERE ";
            SqlCommand comandoExecutar = null;
            SqlDataReader resultadoBusca = null;

            if (fabricante.Codigo > 0)
            {
                SQL_BUSCA += "id_fabricante = @id";

                parametros.Add(new SqlParameter("@id", fabricante.Codigo));
            }

            if (fabricante.Nome != null && !fabricante.Nome.Equals(""))
            {

                if (SQL_BUSCA.Contains('@'))
                {
                    SQL_BUSCA += " AND ";
                }
                else
                {

                }
                SQL_BUSCA += "nome LIKE @nome";
                parametros.Add(new SqlParameter("@nome", "%" + fabricante.Nome + "%"));
            }

            if (fabricante.Cnpj != null && !fabricante.Cnpj.Equals(""))
            {

                if (SQL_BUSCA.Contains('@'))
                {
                    SQL_BUSCA += " AND ";
                }
                else
                {

                }
                SQL_BUSCA += "cnpj = @cnpj";
                parametros.Add(new SqlParameter("@cnpj", fabricante.Cnpj));
            }

            try
            {
                connection.Open();

                comandoExecutar = new SqlCommand(SQL_BUSCA, connection);

                foreach (var parametro in parametros)
                {
                    comandoExecutar.Parameters.Add(parametro);
                }

                resultadoBusca = comandoExecutar.ExecuteReader();

                while (resultadoBusca.Read())
                {
                    auxiliar = new Fabricante();

                    auxiliar.Codigo = Int32.Parse(resultadoBusca["id_fabricante"].ToString());
                    auxiliar.Nome = resultadoBusca["nome"].ToString();
                    auxiliar.Cnpj = resultadoBusca["cnpj"].ToString();

                    fabricantesRecuperados.Add(auxiliar);
                }

            }
            catch (Exception cause)
            {
                throw new Exception("A busca não trouxe nenhum resultado - causa: " + cause.Message);
            }
            finally
            {
                connection.Close();
            }

            return fabricantesRecuperados;
        }
    }
}
